package model

import (
	"fmt"
	"gitee.com/liumou_site/gdf"
	"gitee.com/liumou_site/logger"
	"sync"
	"time"
)

// DownloadUrl 根据给定的URL下载文件。使用WaitGroup来等待下载任务完成。
// url: 需要下载的文件的URL。
// wg: 用于同步下载任务的WaitGroup。
// Max: 下载文件的最大大小限制。
func (info *Info) DownloadUrl(url string, wg *sync.WaitGroup, Max int64) {
	defer wg.Done() // 当下载任务完成时，通知WaitGroup。
	
	// 检查内存使用情况
	if info.MemoryMon != nil {
		stats := info.MemoryMon.GetMemoryStats()
		if usageRatio, ok := stats["usage_ratio"].(float64); ok && usageRatio > 0.9 {
			logger.Warn(fmt.Sprintf("内存使用率过高 (%.2f%%)，延迟下载任务", usageRatio*100))
			time.Sleep(2 * time.Second)
		}
	}

	// 检查是否支持范围下载。
	if gdf.GetRangeStatus(url) {
		// 创建一个新线程来执行范围下载。
		dt := gdf.NewThread(url)
		// 执行下载到缓冲区。
		err := dt.DownLoadBuff()
		if err != nil {
			// 记录下载错误。
			logger.Error(err)
			return
		}
	} else {
		// 对于不支持范围下载的情况，使用单线程下载。
		ds, err := gdf.NewSingleness(url, "file")
		if err != nil {
			// 记录创建下载器的错误。
			logger.Error(err)
			return
		}
		// 设置下载文件的最大大小限制。
		ds.MaxSize = Max
		// 执行默认的下载到缓冲区的操作。
		err = ds.DownLoadDefaultBuff()
		if err != nil {
			// 记录下载错误。
			logger.Error(err)
			return
		}
	}
}
